home *** CD-ROM | disk | FTP | other *** search
/ One Click 11 / OneClick11.iso / Manuntencao / Reparo / SQL Server 2000 Security Tools 8 / SQLCritUpdPkg_ENU.exe / SMSDeploy / sqlfix.vbs < prev    next >
Encoding:
Text File  |  2003-02-07  |  13.8 KB  |  405 lines

  1. '-----------------------------------------------------------------------------------------------
  2. ' SQL Security Update
  3. '-----------------------------------------------------------------------------------------------
  4. '  Filename        : SQLFIX.VBS
  5. '  Author Name    : Levi Stevens 
  6. '  Date Created    : Sunday Jan 26th, 2003
  7. '  Version       : v1.1.021
  8. '-----------------------------------------------------------------------------------------------
  9. '
  10. ' Revision History:
  11. '
  12. '    01-26-03: Created. (levis) v1.0.011
  13. '    01-29-03: External release (build18) added localized, pulled win9x (levis) v1.0.19
  14. '       01-30-03: Modified.Sethu Srinivasan (SethS) v1.1.020
  15. '                 SQLHotfixpackage executable names to SQLHotfix_{LangID}.exe 
  16. '              
  17. '       02-02-03: Modified (SethS) v1.1.021
  18. '          Added sscheck /d /r - re-enables services
  19. '          Added SSCHECK return value in status message
  20. '                 Modified MIF status messages. 
  21. '-----------------------------------------------------------------------------------------------
  22.  
  23.     'Declare all global variables
  24.     Option Explicit
  25.     On Error Resume Next
  26.     Dim ver : ver = "v1.1 build 021"
  27.     Dim UserDomain, UserName, ComputerName, OutPut, logfile
  28.     Dim Root, sTitle, windir, temp, sReturnList
  29.     Dim i, sHeader, nResult, sLogPath, sList, sFolder, sURL
  30.  
  31.     'Declare all constants
  32.     Const ForReading = 1, ForWriting = 2, ForAppending = 8
  33.     Const WindowsFolder = 0, SystemFolder = 1, TemporaryFolder = 2 
  34.     Const vbQuote = """", vbVariantArray = 8204, vbOffset = "    "
  35.  
  36. '-----------------------------------------------
  37. ' Initialize objects
  38. '-----------------------------------------------
  39.  
  40.     dim wsh : set wsh = Wscript.CreateObject("Wscript.Shell")
  41.     dim fso : set fso = Wscript.CreateObject("Scripting.FileSystemObject")
  42.     dim net : set net = Wscript.CreateObject("Wscript.Network")
  43.     dim arg : set arg = WScript.Arguments
  44.  
  45. '-----------------------------------------------
  46. ' Environment Settings
  47. '-----------------------------------------------
  48.     
  49.     UserDomain = UCASE(net.UserDomain)
  50.     UserName = UCASE(net.UserName)
  51.     ComputerName = UCASE(net.ComputerName)
  52.  
  53.     root = Left(Wscript.ScriptFullName, InStrRev(Wscript.ScriptFullName,"\"))
  54.     windir = wsh.ExpandEnvironmentStrings("%Windir%")
  55.     temp = fso.GetSpecialFolder(TemporaryFolder)
  56.     logfile = "sqlfix.log"
  57.  
  58. '-----------------------------------------------
  59. ' Check For any switches
  60. '-----------------------------------------------
  61.     'default boolean value
  62.     dim bDebug : bDebug = False
  63.     dim bSMS : bSMS = False
  64.     dim bQFE : bQFE = False
  65.     
  66.     For i = 0 To arg.Count - 1
  67.         Select Case LCase(arg.item(i))
  68.             Case "/debug" : bDebug = True
  69.             Case "/sms" : bSMS = True
  70.             Case "/qfe" : bQFE = True
  71.             Case "/msg" : Call DisplayMsg("msg")
  72.             Case "/msgqfe" : Call DisplayMsg("msgqfe")
  73.         End Select
  74.     Next
  75.     
  76. '-----------------------------------------------
  77. ' Create log file object
  78. '-----------------------------------------------
  79.  
  80.     Err.Clear
  81.     sLogPath = windir & "\debug\"
  82.     If fso.FileExists(sLogPath & logfile) Then
  83.         set output = fso.OpenTextFile(sLogPath & logfile, ForAppending,True)
  84.     Else
  85.         set output = fso.CreateTextFile(sLogPath & logfile)
  86.     End If
  87.     If Err.Number <> 0 Then
  88.         sLogPath = Temp & "\"
  89.         WriteError "Failed to create log in Debug folder"
  90.         'Not an administrator
  91.         If fso.FileExists(sLogPath & logfile) Then
  92.             set output = fso.OpenTextFile(sLogPath & logfile,ForAppending,True)
  93.         Else
  94.             set output = fso.CreateTextFile(sLogPath & logfile)
  95.         End If
  96.     End If
  97.  
  98. '-----------------------------------------------
  99. ' Log Header
  100. '-----------------------------------------------
  101.     
  102.     'Write Header
  103.     sHeader = vbCrLf & "=== SQL Fix " & ver & ";" & Now & ";" & ComputerName & ";" & _
  104.               UserDomain & "\" & UserName & " ===" & vbCrLf
  105.     Output.WriteLine sHeader
  106.     Err.Clear
  107.     WriteLog sHeader
  108.  
  109. '-----------------------------------------------
  110. ' Run SSCHECK
  111. '-----------------------------------------------    
  112.  
  113.       If Fso.FileExists(root & "sscheck.exe" ) Then
  114.             nResult = Wsh.Run(root & "sscheck.exe /d /r ",0,True)
  115.       Else
  116.             nResult = 1015
  117.       End If
  118.  
  119.  
  120.     sReturnList = AddToList(sReturnList,"SSHECK(" & nResult & ")",",")    
  121.     WriteLog "SSCHECK result [" & nResult & "]"
  122.     If Not bQFE and Not nResult = 0 Then
  123.         'display message to user
  124.         wsh.Run "wscript.exe " & Wscript.ScriptFullName & " /msg"
  125.     End If
  126.     
  127.     If bQFE Then
  128.         Select Case nResult
  129.             Case 0 : WriteLog "Not running QFE, system is compliant"
  130.             Case 1,2 : Call InstallQFE()
  131.             Case Else : WriteLog "Not running QFE, error returned by SSCHECK.EXE"
  132.         End Select
  133.     End If
  134.     
  135.     'end the script
  136.     Call EndScript(nResult)    
  137.  
  138. '-------------------------------------------------------------------------------------------------------------------
  139. ' FUNCTIONS SECTION
  140. '-------------------------------------------------------------------------------------------------------------------
  141. Function InstallQFE()
  142.     dim sInstances, sKey, sRegKey, sLangID
  143.     dim nPatchReturn, sPatchFile, nShow
  144.     dim bSuccess : bSuccess = False
  145.     nPatchReturn = 255
  146.     If bDebug Then
  147.         nShow = 1
  148.     Else
  149.         nShow = 0
  150.     End If
  151.     'check version for all instances
  152.     sInstances = RegRead("HKLM\Software\Microsoft\Microsoft SQL Server\InstalledInstances")
  153.     If IsEmptyNull(sInstances) Then sInstances = Array("MSSQLSERVER")
  154.     For Each sKey In sInstances
  155.         WriteLog "===" & sKey & "==="
  156.         'determine reg location for default/instances
  157.         'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\CurrentVersion
  158.         If Ucase(Trim(sKey)) = "MSSQLSERVER" Then
  159.             sRegKey = "HKLM\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\CurrentVersion\Language"
  160.         Else
  161.             sRegKey = "HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\" & Trim(sKey) & "\MSSQLServer\CurrentVersion\Language"
  162.         End If
  163.         'If bDebug Then Wscript.Echo "Get LangID: " & sRegKey
  164.         sLangID = RegRead(sRegKey)
  165.         sList = AddToList(sList,sLangID,".")
  166.     Next
  167.     If Not IsEmptyNull(sList) Then
  168.         For Each sLangID In Split(sList,".",-1,vbTextCompare)
  169.             'install QFE
  170.             If IsNumeric(sLangID) Then
  171.                 If bDebug Then Wscript.Echo "LangID: " & sLangID
  172.                 Select Case Cint(sLangID)
  173.                     Case 1033 : sPatchFile = "SQLHotfix_ENU.exe"
  174.                     Case 2052 : sPatchFile = "SQLHotfix_CHS.exe"
  175.                     Case 1028 : sPatchFile = "SQLHotfix_CHT.exe"
  176.                     Case 3082,1034 : sPatchFile = "SQLHotfix_ESN.exe"
  177.                     Case 1036 : sPatchFile = "SQLHotfix_FRN.exe"
  178.                     Case 1031 : sPatchFile = "SQLHotfix_GER.exe"
  179.                     Case 1040 : sPatchFile = "SQLHotfix_ITA.exe"
  180.                     Case 1041 : sPatchFile = "SQLHotfix_JPN.exe"
  181.                     Case 1042 : sPatchFile = "SQLHotfix_KOR.exe"
  182.                 End Select
  183.                 If IsEmptyNull(sPatchFile) Then
  184.                     bSuccess = False
  185.                     sReturnList = AddToList(sReturnList,"SQLHotfix_" & sLangID & "(1015)",",")
  186.                     WriteLog "Lang Unknown: " & sLangID
  187.                 Else
  188.                     If Fso.FileExists(root & "qfe\" & sPatchFile) Then
  189.                         nPatchReturn = Wsh.Run(root & "qfe\" & sPatchFile ,nShow,True)
  190.                         Select Case nPatchReturn
  191.                             Case 0, 3010 : WriteLog "Success " & sPatchFile & " result [" & nPatchReturn & "]"
  192.                             Case Else 
  193.                                 WriteLog "Failed " & sPatchFile & " result [" & nPatchReturn & "]"
  194.                                 bSuccess = False
  195.                         End Select
  196.                         sReturnList = AddToList(sReturnList,sPatchFile & "(" & nPatchReturn & ")",",")
  197.                     Else
  198.                         sReturnList = AddToList(sReturnList,sPatchFile & "(1015)",",")
  199.                         WriteLog "File not found: " & root & "qfe\" & sPatchFile
  200.                     End If
  201.                 End If
  202.             End If            
  203.         Next
  204.     End If
  205.     'end script with return code
  206.     If bSuccess Then
  207.         EndScript(0)
  208.     Else
  209.         EndScript(nPatchReturn)
  210.     End If
  211. End Function
  212.  
  213. Function IsEmptyNull(sCheck)
  214.     IsEmptyNull = False
  215.     If IsObject(sCheck) Then Exit Function
  216.     If IsArray(sCheck) Then Exit Function
  217.     If VarType(sCheck) = vbEmpty Then IsEmptyNull = True : Exit Function
  218.     If VarType(sCheck) = vbNull Then IsEmptyNull = True : Exit Function
  219.     If sCheck = "" Then IsEmptyNull = True
  220. End Function
  221.  
  222. Function WriteLog(sMessage)
  223.     On Error Resume Next
  224.     Err.Clear
  225.     'display output to console
  226.     If bDebug Then Wscript.Echo vbOffset & sMessage
  227.     'write output to logfile
  228.     sMessage = Trim(sMessage)
  229.     If IsObject(Output) Then Output.Writeline sMessage
  230. End Function
  231.  
  232. Function WriteError(sMessage)
  233.     dim sErrSource, sErrDesc, sErrNum
  234.     If Err.Number = 0 Then Exit Function
  235.     'load error values
  236.     sErrSource = Err.Source
  237.     sErrDesc = Err.Description
  238.     If IsNumeric(Err.number) Then
  239.         sErrNum = Hex(Err.number)
  240.     Else
  241.         sErrNum = Err.number
  242.     End If
  243.     Err.Clear
  244.     'ensure values set
  245.     If IsEmptyNull(sErrSource) Then sErrSource = "Unknown"
  246.     If IsEmptyNull(sErrDesc) Then sErrDesc = "No description available"
  247.     If IsEmptyNull(sErrNum) Then sErrNum = "unknown"
  248.     'write the mesage
  249.     WriteLog sMessage & ": [" & sErrSource & "] " & sErrDesc & " (" & sErrNum & ")"
  250. End Function
  251.  
  252. Sub CheckError
  253.     If Err = 0 Then Exit Sub
  254.     WriteLog Err.Source & ": " & Err.Description & " [" & Hex(Err) & "]"
  255.     Err.Clear
  256. End Sub
  257.  
  258. Function EndScript(nExitCode)
  259.         If bSMS Then Call CreateMif(nExitCode)
  260.         WriteLog "Exit with code [" & nExitCode & "]"
  261.         Wscript.Quit(nExitCode)
  262. End Function
  263.  
  264. Function AddToList(sList, sValue, sDelim)
  265.     dim sReturn    
  266.     If IsEmptyNull(sList) Then
  267.         sReturn = sValue
  268.     Else
  269.         'do not allow duplicate for string values
  270.         If Instr(1,sList,sValue,vbTextCompare) <> 0 Then
  271.             sReturn = sList
  272.         Else
  273.             sReturn = sList & sDelim & sValue
  274.         End If
  275.     End If
  276.     AddToList = TrimChar(sReturn,sDelim)
  277. End Function
  278.  
  279. Function TrimChar(sExpression,sChar)
  280.     'trim from the right side
  281.     Do While Lcase(Left(sExpression,1)) = Lcase(sChar)
  282.         sExpression = Right(sExpression,Len(sExpression)-1)
  283.     Loop
  284.     'trim from the left side
  285.     Do While Lcase(Right(sExpression,1)) = Lcase(sChar)
  286.         sExpression = Left(sExpression,Len(sExpression)-1)
  287.     Loop
  288.     TrimChar = sExpression
  289. End Function
  290.  
  291. '-----------------------------------------------
  292. ' Get display text
  293. '-----------------------------------------------
  294. Function DisplayMsg(sMode)
  295.     dim sFile, sMsg, sLine, sIndex
  296.     Dim oFile, oFileStream
  297.     sFile = root & "msgbox.txt"
  298.     
  299.     'load settings from file
  300.     If Fso.FileExists(sFile) Then
  301.         Set oFile = Fso.GetFile(sFile)
  302.         Set oFileStream = oFile.OpenAsTextStream(1,-2)
  303.         If Err.number <> 0 Then Wscrip.Quit(1)
  304.         Do While Not oFileStream.AtEndOfStream
  305.             sLine = oFileStream.ReadLine
  306.             If Instr(1,sLine,"=",vbTextCompare) <> 0 Then
  307.                 sIndex = Split(sLine,"=",-1,vbTextCompare)
  308.                 If bDebug Then Wscript.Echo "Index0: " & sIndex(0) & ", Index1: " & sIndex(1)
  309.                 Select Case Lcase(sIndex(0))
  310.                     Case "url" : sURL = sIndex(1)
  311.                     Case "title" : sTitle = sIndex(1)
  312.                 End Select
  313.                 If Not IsEmptyNull(sURL) and Not IsEmptyNull(sTitle) Then Exit Do                
  314.             End If
  315.         Loop
  316.     End If
  317.     oFileStream.Close
  318.     
  319.     If IsEmpty(sURL) Then sURL = "http://msdn.microsoft.com"
  320.     If IsEmpty(sTitle) Then sTitle = "SQL Emergency Disabler"
  321.     If sMode = "msg" Then
  322.         sMsg =    "Your system does not meet the minimum SQL" & vbCrLf & _
  323.                 "requirements and is at risk of the W32.Slammer virus." & vbCrLf & vbCrLf & _
  324.                 "The SQL service on this system has been terminated." & vbCrLf & _
  325.                 "Please go to " & sURL &  " for more information."
  326.     Else
  327.         sMsg =    "Your system does not meet the minimum SQL" & vbCrLf & _
  328.                 "requirements and is at risk of the W32.Slammer virus." & vbCrLf & vbCrLf & _
  329.                 "The SQL service has been termined and the latest QFE has been applied." & vbCrLf & _
  330.                 "Please go to " & sURL &  " for more information."
  331.     End If    
  332.     MsgBox sMsg,vbExclamation,sTitle
  333.     Wscript.Quit(0)
  334. End Function
  335.  
  336. Function RegRead(sRegkey)
  337.     RegRead = ""
  338.     If IsEmptyNull(sRegkey) Then Exit Function
  339.     On Error Resume Next
  340.     Err.Clear
  341.     dim sTemp : sTemp = wsh.RegRead(sRegkey)
  342.     If Err.number = &H80070002 Then
  343.         If bDebug Then Wscript.Echo vbOffset & "Key '" & sRegkey & "' does not exist"
  344.         Err.Clear
  345.         RegRead = ""
  346.     Else
  347.         If Err.number <> 0 Then
  348.             WriteError "Error reading key " & sRegkey
  349.         Else
  350.             RegRead = sTemp
  351.         End If
  352.     End If
  353. End Function
  354.  
  355. Sub CreateMIF(nReturn)
  356.     dim sMIFFile : sMIFFile = "sqlfix"
  357.     dim sMIFCompany : sMIFCompany = "System Administrator"
  358.     dim sMIFProduct : sMIFProduct = "System Administrator"
  359.     dim sMIFVer : sMIFVer = "1.1"
  360.     dim sMIFDesc : sMIFDesc = CStr(nReturn) & ": Unknown Error."
  361.     dim sMIFStatus : sMIFStatus = "0"
  362.     dim sExec, nResult
  363.     
  364.     'get specific message
  365.     If IsNumeric(nReturn) Then
  366.         'general errors
  367.         Select Case nReturn
  368.             Case 1015 : sMIFDesc = "1015: Unable to find sscheck.exe."
  369.             Case 1017 : sMIFDesc = "1017: Object not found."
  370.         End Select
  371.         'error with QFE
  372.         If bQFE Then
  373.             Select Case nReturn
  374.                 Case 1015 : sMIFDesc = "1015: Unable to find sscheck.exe."
  375.                 Case 1017 : sMIFDesc = "1017: Object not found."
  376.                 Case 0,3010 : sMIFDesc = nResult & ": The QFE was applied successfully"
  377.             End Select
  378.         Else    
  379.         'errors with SSCHECK only
  380.             Select Case nReturn
  381.                 Case 0 : sMIFDesc = "0: No action required. No need to run the SQL Critical Update utility for this instance at this time"
  382.                 Case 1 : sMIFDesc = "1: Action recommended. Run the SQL Critical Update Utility. See readme for details"
  383.                 Case 2 : sMIFDesc = "2: Action required.  Run the SQL Critical Update Utility. See readme for details."
  384.                 Case 255: sMIFDesc = "255: There was an error and sscheck.exe failed unexpectedly."
  385.             End Select
  386.         End If
  387.         'success or failure?
  388.         Select Case nReturn
  389.             Case 0 : sMIFStatus = "1" 'good
  390.             Case Else : sMIFStatus = "0" 'bad
  391.         End Select
  392.     End If
  393.     sMIFDesc = sMIFDesc & " " & sReturnList
  394.     sExec = """" & root & "ISMIF32.EXE" & """" & " -f " & """" & sMIFFile & """" & _
  395.             " -c " & """" & sMIFCompany & """" & " -p " & """" & sMIFProduct & """" & _
  396.             " -v " & """" & sMIFVer & """" & " -d " & """" & Left(sMIFDesc,255) & """" & _
  397.             " -s " & sMIFStatus & " -q"
  398.  
  399.     WriteLog "Create MIF: " & sExec
  400.     If fso.FileExists(root & "ISMIF32.EXE") Then 
  401.         WriteLog "MIF Result: " & wsh.Run(sExec,0,True)
  402.     Else
  403.         WriteLog "MIF Result: File not found " & root & "ISMIF32.EXE"
  404.     End If
  405. End Sub